package cn.tedu.rabbitmq.config;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 使用spring框架的配置类 生命所需组件
 */
@Configuration
public class DeclareConfiguration {
    /**
     * 生命的所有组件 以及绑定关系 在当前整合架构 中都是容器的bean对象
     * demo-queue Queue的容器bean对象
     * demo-ex direct Exchange的容器bean对象
     * demo-queue使用demo-rk绑定demo-ex 路由交换机 Binding的容器bean对象
     */
    //声明queue对象
    @Bean
    public Queue demoQueue(){
        //channel.queueDeclare(队列名称,持久化,专属,自动删除,队列属性)
        //第一种声明方式,直接new
        //return new Queue("demo-queue",false,false,false,null);
        //第二种声明方式,框架提供的builder构建器 QueueBuilder类似的还有 ExchangeBuilder BindingBuilder
        return QueueBuilder.nonDurable("demo-queue").build();
    }
    //声明交换机
    @Bean
    public Exchange demoDirect(){
        //channel.exchangeDeclare(交换机名称,交换机类型,持久化,自动删除,交换机属性)
        //第一种声明,直接new
        //第二种,使用构建器
        return ExchangeBuilder.directExchange("demo-ex").build();
    }
    //声明绑定关系
    @Bean
    public Binding demoBinding(){
        //channel.queueBind(队列名称,交换机名称,路由键)
        //第一种声明,直接new
        //第二种,使用BindingBuilder
        return BindingBuilder.bind(demoQueue()).to(demoDirect()).with("demo-rk").noargs();
    }
}
